// vslice.cpp -- using valarray slice
#include <iostream>
#include <valarray>
#include <cstdlib>

const int SIZE = 12;

typedef std::valarray<int> vint;

void show(const vint &v, int cols);

int main() {
    using std::slice;   // from <valarray>
    using std::cout;
    vint valint(SIZE);  // think of as 4 rows of 3

    int i;
    for (i = 0; i < SIZE; ++i)
        valint[i] = std::rand() % 10;
    cout << "Original array:\n";
    show(valint, 3);    // show in 3 columns
    vint vcol(valint[slice(1, 4, 3)]);  // extract 2nd column
    cout << "Second column:\n";
    show(vcol, 1);  // show in 1 column
    vint vrow(valint[slice(3, 3, 1)]);  // extract 2nd column
    cout << "Second row:\n";
    show(vrow, 3);
    valint[slice(2, 4, 3)] = 10;    // assign to 2nd column
    cout << "Set last column to 10:\n";
    show(valint, 3);
    cout << "Set first column to sum of next two:\n";
    // + not defined for slices, so convert to valarray<int>
    valint[slice(0, 4, 3)] = vint(valint[slice(1, 4, 3)])
                             + vint(valint[slice(2, 4, 3)]);
    show(valint, 3);
    return 0;
}

void show(const vint &v, int cols) {
    using std::cout;
    using std::endl;

    int lim = v.size();
    for (int i = 0; i < lim; ++i) {
        cout.width(3);
        cout << v[i];
        if (i % cols == cols - 1)
            cout << endl;
        else
            cout << ' ';
    }
    if (lim % cols != 0)
        cout << endl;
}
